package work.base.data.date.time;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.Set;

/**
 * java.time包基本使用 Java 8的新库
 *
 * Instant 时间戳
 * LocalDate 处理日期 （只包含日期 年月日 不包含时间 时分秒）
 * LocalTime 处理时间  (只包含时分秒)
 * LocalDateTime 它包含了日期及时间
 * ZonedDateTime 时区的日期时间。
 *
 * 通过Date的from()  方法把java.time的对象转化为Date对象 参数是Instant时间戳
 *
 * LocalDate.atStartOfDay() 方法
 *
 * LocalDate parse() 方法 把字符传转化为日期时间对象
 */
public class LocalDateTimeTest {

    public static void main(String[] args) {

        // 1 LocalDate的初始化的两种方式
        LocalDate localDate1 = LocalDate.now();
        LocalDate localDate2 = LocalDate.of(2021, 6, 23);
        // toString把LocalDate转化为字符串 标准类型 yyyy-mm-dd 2007-12-03.
        System.out.println(localDate1.toString());
        // parse() 把字符串转化为LocalDate对象
        LocalDate localDate10 = LocalDate.parse("2021-11-22");


        // LocalDate加减的计算 plusXXX() minusXXX() 返回新的LocalDate对象
        LocalDate localDate3 = localDate2.plusDays(4);
        // LocalDate转化为LocalDateTime 时分秒都是0
        LocalDateTime localDateTime0 = localDate2.atStartOfDay();


        // 2 LocalTime初始化的两种方式
        LocalTime localTime1 = LocalTime.now();
        LocalTime localTime2 = LocalTime.of(12, 20, 40);

        // LocalTime 计算时间差
        // 使用Duration类计算时间差  between方法的参数是继承了Temporal接口的对象
        LocalTime lt1 = LocalTime.of(23, 59,59);
        LocalTime lt2 = LocalTime.of(12, 38,12);
        Duration du= Duration.between(lt2, lt1);
        //相差的小时数 可能是负数
        System.out.println("相差的小时数 可能是负数  : " + du.toHours());
        System.out.println("相差的分钟  : " + du.toMinutes());
        //相差的秒 是算上小时的所有时间
        System.out.println("相差的秒数  : " + du.getSeconds());


        // 3 Instant初始化的两种方式
        Instant instant = Instant.now();
        System.out.println("1970-01-01到现在的秒" + instant.getEpochSecond()+"==毫秒=="+instant.toEpochMilli());


        // 4 LocalDateTime的初始化
        LocalDateTime localDateTime = LocalDateTime.now();

        // LocalDateTime和Date对象的转化
        // Date.from()  Instant转化为Date类型 类型转化
        // localDateTime.atZone() 由LocalDateTime转化为ZonedDateTime
        Date date1 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        // Date.toInstant()方法 把Date类型转化为Instant
        LocalDateTime newTime = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        System.out.println(localDateTime);

        // 减一个月的时间
        LocalDateTime ldt1 = localDateTime.minusMonths(1);
        System.out.println("减一个月的时间 ：" + ldt1);

        // 直接修改当月的第几天
        // withDayOfMonth() 获取当月的第几天的时间 返回一个新的对象
        LocalDateTime ldt2 = localDateTime.withDayOfMonth(10);
        System.out.println("设置为10号的时间 ：" + ldt2);


        // 4.1 使用java.time包的DateTimeFormatter格式化时间
        // 使用LocalDateTime.format() 方法格式化时间对象 参数是指定格式化字符串的DateTimeFormatter对象
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
        LocalDateTime ldt = LocalDateTime.now();
        String strDate = ldt.format(dtf);
        System.out.println("格式化之后的时间字符串 ：" + strDate);

        // 5 ZonedDateTime 的构造 指定LocalDateTime和ZoneId 也就是哪个时区
        // 日本时区时间
        ZonedDateTime zonedDateTime1 = ZonedDateTime.of(LocalDateTime.now(),ZoneId.of("Japan"));
        ZonedDateTime zonedDateTime2 =  ZonedDateTime.now();
        // 获取默认时区
        ZoneId zoneId = ZoneId.systemDefault();
        // 所有可用的时区id
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();


        // 月份和星期的枚举类 Month DayOfWeek
        System.out.println("月份："+ Arrays.toString(Month.values())+
                "\n星期："+Arrays.toString(DayOfWeek.values())+
                "\n月份int转name:"+Month.of(3)
        );


        System.out.println("END===");
    }
}
